package com.wjm.api.filepackage;

import java.io.File;

/**
 * Data:2022年07月08日
 * Author:wjm
 * Content: 递归
 *
 *
 * File练习
 *      1）创建目录D：/a/b/c/d/e/f，删除a目录
 *
 *      2）求6的阶乘（使用递归方法）
 *
 */
public class FileDemo4 {
    public static void main(String[] args) {
        /*
        * 第一题
        * */
        File file1 = new File("D:/a/b/c/d/e/f/e");
        //判断该目录是否存在
        if (!file1.exists()){
            //不存在就创建目录
            boolean bb= file1.mkdirs();
            System.out.println(bb);
        }
        file1 = new File("D:/a");
        deleteFiles(file1);


        System.out.println("---------------------------");


        /*
        * 第二题
        * */

        int a = 6;
        //普通方法
        int c = factorial1(a);
        System.out.println(c);

        //递归方法
        int d = factorial2(a);
        System.out.println(d);

    }

    /**
     * 普通方法求阶乘
     * @param a 传入要求的阶乘的数
     * @return 返回结果
     */
    private static int factorial1(int a) {
        for (int i=a-1; i>0;i--){
            a = a*i;
        }
        return a;
    }

    /**
     * 递归方法求阶乘
     * @param a 传入要求的阶乘的数
     * @return 返回结果
     */
    private static int factorial2(int a) {
        //a == 1这个是用来结束递归的判断
        if (a == 1){
            return 1;
        }else {
            //使用递归
             a = a*factorial2(a-1);
            return a;
        }

    }

    /**
     * 使用递归的方式(自己调用自己)，将指定的目录删除
     * @param file 要删除的目录
     */
    private static void deleteFiles(File file) {
        //判断是不是目录，如果是进入进行递归，直到递归到是空目录为止，不是则直接删除
        if (file.isDirectory()){
            //获取子目录或文件对象数组
            File[] files = file.listFiles();
            //对数组进行遍历 (如果当前目录有子目录或者文件就会进入这个for循环，直到当前的目录是空的为止)
            //上面的for循环会一层一层的进入子目录，直到当前的目录是空的时候会跳出for循环
            for (File f : files){
                deleteFiles(f);
            }
        }
        //进入到最底层的空目录时就开始执行删除命令，然后结束最底层的deleteFiles(File file)方法，一层一层的结束deleteFiles(File file)方法
        file.delete();

    }
}
